/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.tp2.etna.exportacion.dao;

import com.tp2.etna.exportacion.modelo.ClienteModel;
import com.tp2.etna.exportacion.modelo.DetalleRequerimientoModel;
import com.tp2.etna.exportacion.modelo.PaisModel;
import com.tp2.etna.exportacion.modelo.ProductoModel;
import com.tp2.etna.exportacion.modelo.RequerimientoModel;
import com.tp2.etna.exportacion.modelo.SolicitudAtencionModel;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository
public class RequerimientoDAOImpl implements
        RequerimientoDAO {

    @Autowired
    private DataSource dataSource;

    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    @Override
    public RequerimientoModel buscarRequerimiento(Integer codigoRequerimiento) {
        RequerimientoModel requerimiento = new RequerimientoModel();
        String query = "select a.codigo, a.destino, a.FechaRegistro, a.FechaRequerimiento, "
                + " a.PrecioAproximado, a.Estado, a.Observacion, "
                + " a.CodigoCliente, b.RUC, b.RazonSocial, b.Direccion, "
                + " a.CodigoPais, c.Nombre as nompais, a.IATA, a.FechaRequerida "
                + " from requerimiento a inner join cliente b "
                + " on a.CodigoCliente = b.Codigo inner join pais c "
                + " on a.CodigoPais = c.codigo "
                + " where a.codigo = ? ";

        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            con = dataSource.getConnection();
            ps = con.prepareStatement(query);
            ps.setInt(1, codigoRequerimiento);
            rs = ps.executeQuery();
            while (rs.next()) {
                requerimiento.setCodigo(rs.getInt("Codigo"));
                requerimiento.setDestino(rs.getString("Destino"));
                requerimiento.setFechaRegistro(rs.getString("FechaRegistro"));
                requerimiento.setFechaRequerimiento(rs.getString("FechaRequerimiento"));
                requerimiento.setPrecioAproximado(rs.getDouble("PrecioAproximado"));
                requerimiento.setEstado(rs.getString("Estado"));
                requerimiento.setObservacion(rs.getString("Observacion"));
                requerimiento.setCodigoCliente(rs.getInt("CodigoCliente"));
                requerimiento.setIata(rs.getString("IATA"));
                requerimiento.setFechaRequerida(rs.getString("FechaRequerida"));

                ClienteModel cliente = new ClienteModel();
                cliente.setRuc(rs.getString("Ruc"));
                cliente.setRazonSocial(rs.getString("RazonSocial"));
                cliente.setDireccion(rs.getString("Direccion"));

                requerimiento.setCliente(cliente);
                requerimiento.setCodigoPais(rs.getInt("CodigoPais"));

                PaisModel pais = new PaisModel();
                pais.setNombre(rs.getString("NomPais"));
                requerimiento.setPais(pais);

                break;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                rs.close();
                ps.close();
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return requerimiento;
    }

    @Override
    public List<DetalleRequerimientoModel> detalleRequerimiento(Integer codigoRequerimiento) {
        List<DetalleRequerimientoModel> detallereq = new ArrayList<DetalleRequerimientoModel>();
        String query = "select 	a.CodigoRequerimiento, a.CodigoRequerimientoDet, "
                + " a.CodigoSolicitudAtencion, a.CodigoProducto, b.Descripcion, a.Cantidad, "
                + " a.CIF, a.FOB, b.Precio, b.UnidadMedida, a.Estado "
                + " from detallerequerimiento a inner join producto b "
                + " on a.CodigoProducto = b.Codigo "
                + " where a.CodigoRequerimiento = ?;";

        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            con = dataSource.getConnection();
            ps = con.prepareStatement(query);
            ps.setInt(1, codigoRequerimiento);
            rs = ps.executeQuery();
            while (rs.next()) {
                DetalleRequerimientoModel itm = new DetalleRequerimientoModel();
                itm.setCodigoRequerimiento(rs.getInt("CodigoRequerimiento"));
                itm.setCodigoRequerimientoDet(rs.getInt("CodigoRequerimientoDet"));
                itm.setCodigoSolicitudAtencion(rs.getInt("CodigoSolicitudAtencion"));
                itm.setCodigoProducto(rs.getInt("CodigoProducto"));
                itm.setCif(rs.getDouble("CIF"));
                itm.setFob(rs.getDouble("FOB"));
                itm.setCantidad(rs.getInt("Cantidad"));
                itm.setEstado(rs.getString("Estado"));
                ProductoModel producto = new ProductoModel();
                producto.setDescripcion(rs.getString("Descripcion"));
                producto.setPrecio(rs.getDouble("Precio"));
                producto.setUnidadMedida(rs.getString("UnidadMedida"));
                itm.setProducto(producto);

                detallereq.add(itm);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                rs.close();
                ps.close();
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return detallereq;
    }

    @Override
    public List<RequerimientoModel> listarRequerimiento(Integer codigoRequerimiento, String reqrazonsocial, String reqruc, Date reqfechadesde, Date reqfechahasta) {
        System.out.println(codigoRequerimiento);
        System.out.println(reqruc);
        System.out.println(reqrazonsocial);
        System.out.println(reqfechadesde);
        System.out.println(reqfechahasta);
        List<RequerimientoModel> requerimientos = new ArrayList<RequerimientoModel>();
        String query = "select a.codigo, a.destino, a.FechaRegistro, a.FechaRequerimiento, "
                + " a.CodigoCliente, b.RUC, b.RazonSocial, b.Direccion, "
                + " a.CodigoPais, c.Nombre as nompais "
                + " from requerimiento a inner join cliente b "
                + " on a.CodigoCliente = b.Codigo inner join pais c "
                + " on a.CodigoPais = c.codigo "
                + " where b.RazonSocial like '%" + reqrazonsocial + "%' ";

        if (codigoRequerimiento != null) {
            if (codigoRequerimiento > 0) {
                query = query + " and a.codigo = " + codigoRequerimiento.toString() + " ";
            }
        }
        if (reqruc != null) {
            if (!reqruc.equals("")) {
                query = query + " and b.ruc = " + reqruc + " ";
            }
        }

        if (reqfechadesde != null && reqfechahasta != null) {
            query = query + " and b.FechaRegistro between ? and ? ;";
        }

        System.out.println(query);

        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            con = dataSource.getConnection();
            ps = con.prepareStatement(query);
            rs = ps.executeQuery();
            if (reqfechadesde != null && reqfechahasta != null) {
                ps.setDate(1, (java.sql.Date) reqfechadesde);
                ps.setDate(2, (java.sql.Date) reqfechahasta);
            }

            while (rs.next()) {
                RequerimientoModel itm = new RequerimientoModel();
                itm.setCodigo(rs.getInt("Codigo"));
                itm.setDestino(rs.getString("Destino"));
                itm.setFechaRegistro(rs.getString("FechaRegistro"));
                itm.setFechaRequerimiento(rs.getString("FechaRequerimiento"));
                itm.setCodigoCliente(rs.getInt("CodigoCliente"));
                itm.setCodigoPais(rs.getInt("CodigoPais"));
                ClienteModel cliente = new ClienteModel();
                cliente.setRazonSocial(rs.getString("RazonSocial"));
                cliente.setDireccion(rs.getString("Direccion"));
                itm.setCliente(cliente);
                PaisModel pais = new PaisModel();
                pais.setNombre(rs.getString("NomPais"));
                itm.setPais(pais);

                requerimientos.add(itm);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                rs.close();
                ps.close();
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return requerimientos;
    }

    @Override
    public DetalleRequerimientoModel DetalleRequerimientoById(Integer codigoRequerimientoDet) {
        DetalleRequerimientoModel detallerequerimiento = new DetalleRequerimientoModel();
        String query = "select  a.CodigoRequerimientoDet, a.CodigoProducto, b.Descripcion, a.Estado "
                + " from detallerequerimiento a inner join producto b "
                + " on a.CodigoProducto = b.Codigo "
                + " where a.CodigoRequerimientoDet = ? ";

        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            con = dataSource.getConnection();
            ps = con.prepareStatement(query);
            ps.setInt(1, codigoRequerimientoDet);
            rs = ps.executeQuery();
            while (rs.next()) {
                detallerequerimiento.setCodigoRequerimientoDet(rs.getInt("CodigoRequerimientoDet"));
                detallerequerimiento.setCodigoProducto(rs.getInt("CodigoProducto"));

                ProductoModel producto = new ProductoModel();
                producto.setDescripcion(rs.getString("Descripcion"));

                detallerequerimiento.setProducto(producto);
                detallerequerimiento.setEstado(rs.getString("Estado"));

                break;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                rs.close();
                ps.close();
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return detallerequerimiento;
    }

    @Override
    public Boolean ActualizarEstadoDetalleRequerimiento(Integer codigoRequerimientoDet, String Estado) {
        String query = "update detallerequerimiento set estado = '" + Estado + "' "
                + " where codigoRequerimientoDet=?;";

        Connection con = null;
        PreparedStatement ps = null;
        try {
            con = dataSource.getConnection();

            ps = con.prepareStatement(query);
            ps.setInt(1, codigoRequerimientoDet);

            int out = ps.executeUpdate();
            if (out != 0) {
                return true;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                ps.close();
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return false;
    }

}
